#pragma once

#include <iostream>
#include <string>
#include <fstream>
#include <vector>
#include <map>
#include <queue>
#include <stack>
#include <sstream>  
using namespace std;

typedef struct {
	int year;
	int month;
	int day;
}Date;

typedef struct {
	int depth;			//代数
	string name, gender, education, occupation;	 // 姓名， 性别， 学历， 职业
	Date birthday;		// 出生日期
	string IsAlive;		// 是否在世
	Date deathday;		// 死亡日期
	string remarks;		// 备注
}FamilyMember;

typedef struct FamilyTreeNode {
	int depth;					// 代数
	FamilyMember person;
	FamilyTreeNode* leftchild;		// 左孩子 
	FamilyTreeNode* rightbrother;		// 右兄弟
	FamilyTreeNode* parent;			// 父节点
}FamilyTreeNode;

void MenuInterface(); // 显示菜单界面
void SetParent(FamilyTreeNode*& root, FamilyTreeNode*& parent); // 设置父节点
void PrintAllMessage(FamilyTreeNode* root); // 打印家谱所有成员信息
void PrintMessage(FamilyTreeNode* target); // 打印家谱某成员信息
void PrintDepthMessage(FamilyTreeNode* root, int depth); // 打印某层成员信息
void SearchNameAndBirthdate(FamilyTreeNode* root, string name, Date birthday, bool& IsFind); // 按某成员姓名和出生日期查找信息
void PrintMessageByNameAndBirthdate(FamilyTreeNode* root); // 按姓名和出生日期输出成员信息
void ReturnTreenodeByNameAndBirthday(FamilyTreeNode *&root, string name, FamilyTreeNode *&target, Date birthday);
void InsertChild(FamilyTreeNode*& root);  // 添加孩子
void DeleteMember(FamilyTreeNode*& root); // 删除某成员
void ModifyMember(FamilyTreeNode*& root); // 修改某成员信息
void countGenderRatio(FamilyTreeNode* root, int& maleCount, int& femaleCount); // 统计男女比例
void getGenderRatio(FamilyTreeNode* root); // // 统计男女比例
double getAverageAge(FamilyTreeNode* root); // 统计平均寿命
void countMembers(FamilyTreeNode* root, int& count, int& totalAge); // 统计家庭成员总数
